查看原文
其他

网工Python之路之paramiko 模块实验(五)异常处理

z释然z 释然IT杂谈 2023-04-23

【文末赠书】

感谢知乎两位大佬:@弈心和@朱嘉盛

@弈心大佬的实验主要是基于 linux 系统、思科设备或 GNS3 模拟器完成。

@朱嘉盛大佬考虑到当前在国内华为较为主流,也用 Windows 系统,尝试用华为的真机或者 eNSP 模拟器,把书中提及的实验做一做,方便大家学习记录,方便交流。

小编这里采用eve-ng+liunx来模拟实践思科部分的实验效果,以及采用ensp+windows复现一遍华为的实验。


思科实验:

平台工具:
  • 实验平台:WIN10

  • 使用工具:Evn-ng、python 3.6.8


实验拓扑:

注意:

书中使用了 192.168.2.0/24 ,我这里才有eve桥接的虚拟网段192.168.242.0/24来演示本次实验。

【SSH 服务端】LSW x,IP为 192.168.242.1x/24,连接到透明交换机SW1。 


实验目的:


1、在生产环境中,交换机的管理 IP 基本不可能像实验环境中这样 11 到 15,有些交换机的管理 IP 甚至在不同的网段,这种情况下,我们就不能简单的用 for loop 来循环 IP 地址的最后一段来登录交换机。这里我们要额外开一个文本文件,把我们需要登录的交换机 IP 全部写进去,然后用 for loop 配合 open() 函数来批量登录所有交换机。(抄书的哈) 

2、用上面的方法登录所有交换机,把华为交换机默认的 MSTP 修改成 STP。

实验准备:

LSW2 的 E0/0 进行 shutdown,模拟上联链路故障(拓扑端口也变红。)

LSW3 的用户 python 密码由 123 改为 456。

我们在实验4脚本基础上拿过来试跑一下,在 ip.txt 先剔除掉 LSW3 (192.168.242.13)的信息,针对性的观察断链了的 LSW2。

【实验4】脚本试跑结果,主要针对 LSW2 的不可达异常情况。

接着,我们把【实验4】脚本拿过来再试跑一下,在 ip.txt 先剔除掉 LSW2 (192.168.242.12)的信息,针对性的观察断链了的 LSW3。

【实验4】脚本试跑结果,主要针对 LSW3 的认证异常情况。


实验环境配置

按照拓扑,每台交换机 vlan 1 都配置 vlanif 的 IP 作为管理。(附 LSW1 的配置,如 LSW2 则仅为将 192.168.242.11 改为 192.168.242.12,这里从简。)


初始化1.配置hostname 和domain-namehostname LSW1ip domain-name shiranit.com
2.产生密钥,产生1024位的密钥crypto key generate rsa general-keys modulus 1024
3.配置sssh的信息会话超时时间ip ssh time-out 120最大认证次数ip ssh authentication-retries 3启用ssh和telnet认证line vty 0 4 transport input ssh telnet login local
4.本地认证用户 enable passwod 123 username python privilege 15 password 123 PS: privilege 15这么设置是为了免去登陆时输入enable密码
5.配置管理地址 interface Vlan 1 ip address 192.168.242.11 255.255.255.0

更多精彩内容关注“释然IT杂谈”

Python 代码

代码讲解,大神在书里和专栏中已逐条做了解释

import paramikoimport timeimport getpassimport sysimport socket
username = input("Username: ")password = getpass.getpass("Password: ")ip_file = sys.argv[1]cmd_file = sys.argv[2]
# 存放认证失败的设备信息switch_with_authentication_issue = []# 存放网络不通的设备信息switch_not_reachable = []
iplist = open(ip_file,'r')for line in iplist.readlines(): try: ip = line.strip() ssh_client = paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh_client.connect(hostname=ip,username=username, password=password,look_for_keys=False) print('=-=-=-=-=-=-=-=-=-=-=-=-=-=') print('已经成功登陆交换机 ' + ip) command = ssh_client.invoke_shell() cmdlist = open(cmd_file,'r') cmdlist.seek(0) for line in cmdlist.readlines(): each_command = line.strip() command.send(each_command + '\n') time.sleep(0.5) cmdlist.close() output = command.recv(65535).decode('ASCII') print(output) except paramiko.ssh_exception.AuthenticationException: print(ip + "用户验证失败!") switch_with_authentication_issue.append(ip) except socket.error: print(ip + "目标不可达!") switch_not_reachable.append(ip)
iplist.close()ssh_client.close()
print('\n 下列交换机用户验证失败:')for i in switch_with_authentication_issue: print(i)
print('\n 下列交换机不可达:')for i in switch_not_reachable: print(i)


实验过程

我们把 ip.txt 列表倒回成所有网元 IP。

我们直接 运行过程截图如下。


华为实验:

平台工具:
  • 实验平台:WIN10

  • 使用工具:eNSP v1.3.00.100、python 3.7.3


实验拓扑:

注意:

书中使用了 192.168.2.0/24 ,我这里才有eve桥接的虚拟网段192.168.242.0/24来演示本次实验。

【SSH 服务端】LSW x,IP为 192.168.242.1x/24,连接到透明交换机SW1。 


实验目的:


1、在生产环境中,交换机的管理 IP 基本不可能像实验环境中这样 11 到 15,有些交换机的管理 IP 甚至在不同的网段,这种情况下,我们就不能简单的用 for loop 来循环 IP 地址的最后一段来登录交换机。这里我们要额外开一个文本文件,把我们需要登录的交换机 IP 全部写进去,然后用 for loop 配合 open() 函数来批量登录所有交换机。(抄书的哈) 

2、用上面的方法登录所有交换机,把华为交换机默认的 MSTP 修改成 STP。

实验准备:

LSW2 的 GE0/0/1 进行 shutdown,模拟上联链路故障(拓扑端口也变红。)

LSW3 的用户 python 密码由 123 改为 456。

我们在实验4脚本基础上拿过来试跑一下,在 ip.txt 先剔除掉 LSW3 (192.168.242.13)的信息,针对性的观察断链了的 LSW2。

【实验4】脚本试跑结果,主要针对 LSW2 的不可达异常情况。

接着,我们把【实验4】脚本拿过来再试跑一下,在 ip.txt 先剔除掉 LSW2 (192.168.242.12)的信息,针对性的观察断链了的 LSW3。

【实验4】脚本试跑结果,主要针对 LSW3 的认证异常情况。


实验环境配置

按照拓扑,每台交换机 vlan 1 都配置 vlanif 的 IP 作为管理。(附 LSW1 的配置,如 LSW2 则仅为将 192.168.242.11 改为 192.168.242.12,这里从简。)


sysname LSW1
aaa# 密码明文 123 local-user python password cipher #*C>*$C`S!INZPO3JBXBHA!! local-user python privilege level 3 local-user python service-type ssh
interface Vlanif1 ip address 192.168.11.11 255.255.255.0
stelnet server enable# 下面这条很关键,我一开始没配置这条,一直 ssh 反馈有错误。# 模拟器的产品手册说这条是默认值,但测试后需要手动配置。ssh authentication-type default password
user-interface vty 0 4 authentication-mode aaa protocol inbound ssh

更多精彩内容关注“释然IT杂谈”

Python 代码

代码讲解,大神在书里和专栏中已逐条做了解释

import paramikoimport timeimport getpassimport sysimport socket
username = input("Username: ")password = getpass.getpass("Password: ")ip_file = sys.argv[1]cmd_file = sys.argv[2]
# 存放认证失败的设备信息switch_with_authentication_issue = []# 存放网络不通的设备信息switch_not_reachable = []
iplist = open(ip_file,'r')for line in iplist.readlines(): try: ip = line.strip() ssh_client = paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh_client.connect(hostname=ip,username=username, password=password,look_for_keys=False) print('=-=-=-=-=-=-=-=-=-=-=-=-=-=') print('已经成功登陆交换机 ' + ip) command = ssh_client.invoke_shell() cmdlist = open(cmd_file,'r') cmdlist.seek(0) for line in cmdlist.readlines(): each_command = line.strip() command.send(each_command + '\n') time.sleep(0.5) cmdlist.close() output = command.recv(65535).decode('ASCII') print(output) except paramiko.ssh_exception.AuthenticationException: print(ip + "用户验证失败!") switch_with_authentication_issue.append(ip) except socket.error: print(ip + "目标不可达!") switch_not_reachable.append(ip)
iplist.close()ssh_client.close()
print('\n 下列交换机用户验证失败:')for i in switch_with_authentication_issue: print(i)
print('\n 下列交换机不可达:')for i in switch_not_reachable: print(i)



实验过程

我们把 ip.txt 列表倒回成所有网元 IP。

我们直接 在CMD 上进入目录执行,运行过程截图如下。


更多精彩推荐:

网工Python之路之paramiko 模块实验(四)分组操作

网工Python之路之paramiko 模块实验(三)读取文件

网工Python之路之paramiko 模块实验(二)循环遍历    

网工Python之路之paramiko 模块实验(一)初来乍到

网工Python之路之基础笔记(一)

运维Python自动化之路:基础信息模块之psutil模块

运维Python自动化之路:基础信息模块之IPy模块

用python实现快速ping网段

python实用脚本:网络设备批量调试及备份


可去知乎关注两位大佬:

https://www.zhihu.com/column/c_1357111055186104320

https://zhuanlan.zhihu.com/p/34932386


赠书福利
赠送图书名额两个Python编程完全自学教程》&&《精进Office:成为Word/Excel/PPT高手各一本,由「 北京大学出版社」赞助提供 ,感谢北大社一直以来对本号的支持。感兴趣的朋友推荐入手一本。
【点击下方小程序参与】

注意:

需开奖前转发此文案到朋友圈,开奖前不得删文,开奖后24小时内联系小编,过期不候。




【小程序体验】

        

          

 

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存